package map;

import java.util.EventObject;


/**rappresenta l'evento che deve essere mandato quando una AbstractMap viene
 * modificata. Una mappa può essere modificato in molti modi:
 * <ul>
 *  <li>si può aggiungere un nuovo elemento nella mappa</li>
 *  <li>si può eliminare un vecchio elemento dalla mappa</li>
 *  <li>si può aggiornare un elemento già presente nella mappa</li>
 * </ul>
 * <p>Un assunto molto importante di questo evento è che <strong>un MapEvent può essere
 * scatenato solo da un oggetto della mappa</strong>: questo rende in parte la classe poco
 * flessibile, poiché se 100 classi vengono eliminate, ognuna scatenerà un MapEvent
 * 
 * @param <OBJECT> indica il tipo di oggetto che ha generato l'evento di tipo {@link #action}
 * 
 * @author koldar
 * @version 1.2
 */
public class MapEvent<OBJECT> extends EventObject{

	private static final long serialVersionUID = 4998328072914147800L;
	
	/**valore di {@link #action}: indica che nulla è stato modificato. questo valore è dummy, ma può essere usato per creare manualmente messaggi*/
	public static final int NOTHING=0;
	/**valore di {@link #action}: indica che qualcosa è stato eliminato dalla mappa*/
	public static final int DELETE=1;
	/**valore di {@link #action}: indica che qualcosa è stato modificato nella mappa*/
	public static final int UPGRADE=2;
	/**valore di {@link #action}: indica che qualcosa è stato inserito nella mappa*/
	public static final int INSERT=3;
	
	/**rappresenta quale azione ha cambiato la mappa. è un'informazione inutile, dato che già i metodi di per sé in MapListener danno tale informazione*/
	private int action;
	/**indica il nuovo valore che l'oggetto che ha subito la perturbazione possiede dopo aver subito la stessa*/
	private OBJECT newvalue;
	
	/**
	 * 
	 * @param source indica la mappa coinvolta nell'evento
	 * @param action
	 * @param oldvalue
	 * @param newvalue
	 */
	public MapEvent(AbstractMap source,int action,OBJECT newvalue) {
		super(source);
		this.newvalue=newvalue;
		this.action=action;
	}

	/**
	 * @return the action. For further information visit {@link #action}
	 */
	public int getAction() {
		return action;
	}

	/**
	 * @param action the action to set
	 */
	public void setAction(int action) {
		this.action = action;
	}

	/**
	 * @return the newvalue
	 */
	public OBJECT getNewvalue() {
		return newvalue;
	}

	/**
	 * @param newvalue the newvalue to set
	 */
	public void setNewvalue(OBJECT newvalue) {
		this.newvalue = newvalue;
	}
	
	

}
